#include <iostream>
using namespace std;
// g++ -o test_abstract test_abstract.cc -std=c++11
class Base {  // 抽象类
  int x;

 public:
  virtual void show() = 0;
  virtual void see() = 0;
  int getX() { return x; }
};
class Derived1 : public Base {  // 非抽象类
 public:
  void show() { cout << "show In Derived1 \n"; }
  void see() { cout << "see In Derived1 \n"; }
  Derived1() {}
};
class Derived2 : public Base {  // 依旧是抽象类
 public:
  void show() { cout << "show In Derived \n"; }
  Derived2() {}
};
int main(void) {
  // Base b;  // 编译错误，不能创建抽象类的对象
  // Base *b = new Base(); 编译错误，理由同上
  Base *bp =
      new Derived1();  // 正确，抽象类的指针和引用 -> 由抽象类派生出来的类的对象
  bp->show();
  // Derived2 d2;  // 编译错误，Derived2未将基类的纯虚函数全部重写，所以是抽象类
  return 0;
}
